home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d12 / ptv1n1.arc / NBSTIME.BAS < prev    next >
BASIC Source File  |  1990-06-08  |  3KB  |  123 lines

  1. ' NBSTIME.BAS  M. Covington  1989
  2. ' Turbo BASIC 1.0 and up, QuickBASIC 2.0 and up
  3.  
  4. ' ************************
  5. ' * Function Definitions *
  6. ' ************************
  7.  
  8. ' FNstr$(num)
  9. ' Like STR$ (built in) but result has no leading blank.
  10.  
  11. DEF FNstr$ (num)
  12.   X$ = STR$(num)
  13.   FNstr$ = RIGHT$(X$, LEN(X$) - 1)
  14. END DEF
  15.  
  16. ' FNdaysin(month,year)
  17. ' gives number of days in nth month of specified year.
  18.  
  19. DEF FNdaysin (month, year)
  20.   days = 31
  21.   IF month=4 OR month=6 OR month=9 OR month=11 THEN days = 30
  22.   IF month=2 THEN days = 28
  23.   IF month=2 AND (year MOD 4)=0 THEN days = 29
  24.   FNdaysin = days
  25. END DEF
  26.  
  27. ' ******************
  28. ' *  Main Program  *
  29. ' ******************
  30.  
  31. ' Open serial port and tell Hayes modem to dial
  32.  
  33.   CLS
  34.   PRINT "Calling NBS to obtain time of day and set clock..."
  35.   ON ERROR GOTO ErrorHandler
  36.   OPEN "COM1:1200,E,7,1,CS,DS,CD" AS #1
  37.   PRINT #1, "ATDT 1-303-494-4774"
  38.  
  39. GetLine:
  40.  
  41. ' Read a line from serial port into text$,
  42. ' ending with CHR$(10) (line feed).
  43. ' Store "TIMEOUT" if nothing is received after 100,000 tries
  44. ' (up to 2 minutes depending on machine).
  45.  
  46.   text$ = "": tries = 0
  47.  
  48.   WHILE (tries<100000) AND (RIGHT$(text$, 1)<>CHR$(10))
  49.     IF NOT EOF(1) THEN
  50.       text$ = text$ + INPUT$(1,#1)
  51.       tries = 0
  52.     END IF
  53.     tries = tries + 1
  54.   WEND
  55.   IF tries=100000 THEN text$ = "TIMEOUT"
  56.  
  57. ' Discard the Return and Line Feed at end of line.
  58.  
  59.   WHILE LEN(text$)>0 AND RIGHT$(text$, 1)<" "
  60.        text$ = LEFT$(text$, LEN(text$) - 1)
  61.   WEND
  62.  
  63. ' Check data received.
  64. ' If modem error message, bail out.
  65. ' If not 49-char line, read another line.
  66.  
  67.   IF text$="TIMEOUT" OR text$="NO CARRIER" OR text$="BUSY" THEN
  68.     PRINT text$; " -- Unable to connect."
  69.     GOTO Finish
  70.   ELSEIF LEN(text$) <> 49 THEN
  71.     GOTO GetLine
  72.   END IF
  73.  
  74.   PRINT "Data received from NBS:"
  75.   PRINT text$
  76.  
  77. ' Convert date to numbers to do time zone conversion.
  78. ' Minutes, seconds, unaffected, remain a string.
  79.  
  80.   yr = VAL(MID$(text$,7,2))
  81.   mo = VAL(MID$(text$,10,2))
  82.   da = VAL(MID$(text$,13,2))
  83.   hr = VAL(MID$(text$,16,2))
  84.   minsec$ = MID$(text$,18,6)
  85.  
  86. ' Convert to user's time zone and check daylight saving time.
  87.  
  88.   hr = hr - 5      ' Eastern time is -5, Pacific is - 8.
  89.  
  90.   dst = VAL(MID$(text$, 25, 2))
  91.   IF dst>1 AND dst<51 THEN hr = hr + 1
  92.  
  93. ' If hour<0, change date to previous day.
  94.  
  95.   IF hr<0 THEN hr = hr + 24: da = da - 1
  96.   IF da=0 THEN mo = mo - 1: da = FNdaysin(mo, yr)
  97.   IF mo=0 THEN yr = yr - 1: mo = 12
  98.  
  99. ' Assume user is in western hemisphere and local time is
  100. ' always *behind* UTC, so no need to check for hr > 23.
  101.  
  102. ' Set the system clock
  103.  
  104.   DATE$ = FNstr$(mo) + "-" + FNstr$(da) + "-" + FNstr$(yr)
  105.   TIME$ = FNstr$(hr) + minsec$
  106.   PRINT "Date and time have been set to: "; DATE$; " "; TIME$
  107.  
  108. ' Close serial port, which drops DTR and hangs up phone
  109.  
  110. Finish:
  111.   CLOSE #1
  112.   END
  113.  
  114. ' *******************
  115. ' *  Error Handler  *
  116. ' *******************
  117.  
  118. ' Ignore parity, framing, overrun errors (Error 57)
  119.  
  120. ErrorHandler:
  121.   IF ERR<>57 THEN PRINT "<Runtime error ";ERL;">"
  122.   RESUME
  123.